/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sopra09.lv6659438.logik.eintragLoeschen;

import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import sopra09.lv6659438.logik.awfUnabhaengigeKomponenten.LoggingInterceptor;
import sopra09.lv6659438.objekte.Autor;
import sopra09.lv6659438.objekte.Buch;
import sopra09.lv6659438.objekte.Zeitschrift;

/**
 * Löscht ein übergebenes Buch oder eine übergebene Zeitschrift aus der Datenbank
 * @author TJ
 */
@Stateless
@Interceptors(LoggingInterceptor.class)
public class EintragLoeschenALBean implements EintragLoeschenALLocal {
    @PersistenceContext
    private EntityManager em;

    /**
     * Löscht die übergebene Zeitschrift
     * @param item Die übergebene Zeitschrift
     * @return true, wenn die Zeitschrift gelöscht wurde, sonst falsch
     */
    public boolean loescheZeitschrift(Zeitschrift item) {
        try {
            em.remove(em.merge(item));
            return true;
        } catch (IllegalArgumentException e){
            e.toString();
            return false;
        }
    }

    /**
     * Löscht das übergebene Buch
     * @param book Das übergebene Buch
     * @return true, wenn das Buch gelöscht wurde, sonst falsch
     */
    public boolean buchLoeschen(Buch book) {
        try {
            Buch buch = getManagedBuch(book);
            if (buch!=null) {
            //Zunächst alle Verbindungen zwischen dem Buch und seinen Autoren lösen!
                Set<Autor>autoren_orig = buch.getAutoren();
                if (autoren_orig!=null && !autoren_orig.isEmpty()) {
                    List<Autor> autoren_kopie =
                    new LinkedList<Autor>(autoren_orig);
                    for (Autor autor :  autoren_kopie){
                        buchUndAutorLoesen(buch,autor);
                    }
                  }
                // dann das buch löschen
                  em.remove(buch);
                  return true;
                } else
                    return false;
            } catch (IllegalArgumentException e) {
                return false;
            }
    }

    /**
     * Löst die wechselseitigen Verbindungen zwischen dem übergebenen
     * Buch und Autor
     * @param book Das zu löschende Buch
     * @param author ein Author des Buches
     * @return true, wenn das Buch gelöscht wurde, sonst falsch
     */
    private boolean buchUndAutorLoesen(Buch book,Autor author) {
       Buch buch = getManagedBuch(book);
       Autor autor = getManagedAutor(author);

      if ((buch!=null) && (autor != null)) {
          buch.getAutoren().remove(autor);
          autor.getBuecher().remove(buch);
          // wenn der gelöste autor keinem anderen buch mehr zugeordnet ist,
          // wird er aus der datenbank gelöscht
          if (autor.getBuecher().isEmpty())
                em.remove(autor);
            return true;
        } else {
            return false;
        }
    }

    /**
     * Hilfsmethode, die für ein übergebenes Buchobjekt eine externe Repräsentation
     * im Zustand managed zurückgibt
     * @param b Das übergebene Buch
     * @return Das übergebene Buch im Zustand managed
     */
   private Buch getManagedBuch(Buch b) {
        if (em.contains(b) ||b==null)
            return b;
        else
            return em.find(Buch.class, b.getId());
    }

    /**
     * Hilfsmethode, die für ein übergebenes Autorobjekt eine externe Repräsentation
     * im Zustand managed zurückgibt
     * @param a Der übergebene Autor
     * @return Den übergebenen Autor im Zustand managed
     */
    private Autor getManagedAutor(Autor a) {
        if (em.contains(a) ||a==null)
            return a;
        else
            return em.find(Autor.class, a.getId());
    }


    // nicht benötigte methoden

    /*
       public boolean buchLoeschen(long id) {
       Buch b = getBuch(id,false);
        if (b!=null)
            return buchLoeschen(b);
        else
            return false;
     }

      private boolean buchUndAutorLoesen(long buch) {
        Buch b = getBuch(buch, false);
        return buchUndAutorLoesen(b,null);

    }

     private Buch getBuch(long id, boolean mitAutorenListe) {
       Buch b = em.find(Buch.class, id);
        if (mitAutorenListe)
            b.getAutoren();
        return b;
    }

    private Autor getAutor(long id, boolean mitBuecherListe) {
       Autor a = em.find(Autor.class, id);
        if (mitBuecherListe)
            a.getBuecher();
        return a;
    }

    */
 
}
